  10 REM ***********************
  20 REM ** ZX RPN CALCULATOR **
  30 REM J.R.WATERMAN MARCH 2017
  40 REM ***********************
  50 REM * ZX80 BRAIN VERSION **
  60 REM ***********************
  70 REM 
  80 REM **** SCREEN SETUP *****
  90 CLEAR 63999
 100 LOAD "zx80chrs"CODE 64000,768
 110 POKE 23607,249
 120 BORDER 7: PAPER 7: INK 0: CLS 
 130 REM DRAW LOGO
 140 RESTORE 240
 150 FOR n=1 TO 10
 160 READ x: READ y: PLOT x,y+2: DRAW 15,0: PLOT x,y+1: DRAW 15,0
 170 NEXT n
 180 FOR n=1 TO 9
 190 READ x: READ y: PLOT x,y+2: DRAW 0,-9: PLOT x+1,y+2: DRAW 0,-9
 200 NEXT n
 210 FOR n=1 TO 7
 220 READ x: READ y: PLOT x,y+2: PLOT x+1,y+2: PLOT x,y+1: PLOT x+1,y+1
 230 NEXT n
 240 DATA 14,169,14,165,14,161,36,169,54,169,54,161,76,169,76,165,76,161,98,169
 250 DATA 32,169,36,169,50,169,54,169,72,173,72,169,90,169,94,169,98,169
 260 DATA 14,167,28,163,32,173,76,163,90,167,90,163,94,173
 270 FOR n=2 TO 5: PRINT AT n,1; PAPER 6;"              ": NEXT n
 280 RESTORE 400: PLOT 14,137
 290 FOR n=1 TO 14: READ x,y: DRAW x,y: NEXT n
 300 PLOT 23,141
 310 FOR n=1 TO 4: READ x,y: DRAW x,y: NEXT n
 320 PLOT 89,145
 330 FOR n=1 TO 46: READ x,y: DRAW x,y: NEXT n
 340 PLOT 71,149
 350 FOR n=1 TO 8: READ x,y: DRAW x,y: NEXT n
 360 PLOT 71,146
 370 FOR n=1 TO 12: READ x,y: DRAW x,y: NEXT n
 380 PLOT 97,141
 390 FOR n=1 TO 8: READ x,y: DRAW x,y: NEXT n
 400 DATA 0,4,15,12,-15,0,0,4,28,0,7,-7,7,7,8,0,-10,-10,10,-10,-8,0,-7,7,-7,-7,-
28,0
 410 DATA 15,12,6,-6,-6,-6,-15,0
 420 DATA 0,9,2,2,1,0,1,1,16,0,1,-1,1,0,1,-1,0,-1,1,-1,0,-12,-1,-1,0,-1,-1,-1,-1
,0,-1,-1,-16,0,-1,1,-1,0,-2,2,-1,0,-2,-2,-1,0,-1,-1,-16,0,-1,1,-1,0,-1,1,0,1,-1,
1,0,3,3,3,-3,3,0,3,1,1,0,1,1,1,1,0,1,1,16,0,1,-1,1,0,3,-3,0,-2,-3,-3,3,-3
 430 DATA -2,2,0,1,2,2,10,0,2,-2,0,-1,-2,-2,-10,0
 440 DATA 10,0,2,-2,0,-1,-2,-2,0-1,0,-1,-1,-6,0,-1,1,-1,0,-2,2,0,1,2,2
 450 DATA -3,3,0,6,3,3,8,0,3,-3,0,-6,-3,-3,-8,0
 460 PRINT AT 5,1; PAPER 6;"RPN CALCULATOR"
 470 INK 6
 480 PLOT 7,128: DRAW 0,31: PLOT 120,128: DRAW 0,31
 490 INK 0
 500 FOR n=108 TO 124 STEP 4
 510 PLOT 8,n: DRAW 111,0: PLOT 8,n+1: DRAW 111,0
 520 NEXT n
 530 REM DRAW KEYS
 540 INK 1: PAPER 0
 550 FOR n=9 TO 21: PRINT AT n,0;"                ": NEXT n
 560 FOR x=8 TO 104 STEP 24
 570 FOR y=24 TO 96 STEP 24
 580 PLOT x,y: DRAW 15,0: DRAW 1,-1: DRAW 0,-15: DRAW -1,-1: DRAW -15,0: DRAW -1
,1: DRAW 0,15
 590 PRINT PAPER 1;AT (176-y)/8,x/8;"  ";AT (184-y)/8,x/8;"  "
 600 NEXT y: NEXT x
 610 INK 7
 620 PRINT PAPER 7;AT 12,18;"0";AT 9,18;"1  2  3";AT 6,18;"4  5  6";AT 3,18;"7  
8  9"
 630 FOR x=145 TO 193 STEP 24
 640 FOR y=73 TO 145 STEP 24
 650 FOR m=0 TO 6: FOR n=0 TO 5
 660 IF POINT (x+m,y+n)=1 THEN PLOT x+m-132,y+n-60
 670 NEXT n: NEXT m: NEXT y: NEXT x
 680 PRINT PAPER 7;AT 12,18;" ";AT 9,18;"       ";AT 6,18;"       ";AT 3,18;"   
    "
 690 PAPER 1
 700 PRINT AT 14,10;"B";AT 14,13;"V";AT 17,10;"K";AT 17,13;"J";AT 20,4;"M";AT 20
,10;"C"
 710 PLOT 108,13: DRAW -3,0: DRAW 0,5: DRAW 3,0: PLOT 106,16: DRAW 1,0: PLOT 110
,13: DRAW 0,5: DRAW 3,-5: DRAW 0,5: PLOT 117,13: DRAW 0,5: DRAW 2,0: DRAW -4,0
 720 INK 6
 730 PRINT AT 16,11;"+";AT 13,14;"-";AT 16,14;"-";AT 19,5;"."
 740 PLOT 90,65: DRAW 4,4: PLOT 94,65: DRAW -4,4: PLOT 116,65: PLOT 116,69
 750 PLOT 84,18: DRAW -2,0: DRAW -1,1: DRAW 0,2: DRAW 1,1: DRAW 2,0: PLOT 86,22:
 DRAW 0,-4: DRAW 3,0: PLOT 91,18: DRAW 0,4: DRAW 2,0: DRAW 1,-1: DRAW -1,-1: DRA
W -1,0: PLOT 94,18: DRAW 0,1
 760 REM DRAW STACK
 770 FOR n=1 TO 20: PRINT AT n,18;"             ": NEXT n
 780 PAPER 6: INK 0
 790 FOR n=0 TO 21: PRINT AT n,17;" ";AT n,31;" ": NEXT n
 800 PRINT AT 0,18;"             ";AT 2,18;"             ";AT 19,18;"           
  ";AT 21,18;"             "
 810 INK 0
 820 PLOT 136,0: DRAW 0,175: DRAW 119,0: DRAW 0,-175: DRAW -119,0
 830 PAPER 1: INK 7
 840 PRINT AT 1,22;"STACK"
 850 PRINT AT 20,30;"0"
 860 POKE 23607,60
 870 REM ***********************
 880 REM * SET KEYBOARD ARRAY **
 890 REM ***********************
 900 DIM k(90)
 910 DIM p(8)
 920 RESTORE 1010
 930 REM - ENTER KEY
 940 LET k(13)=23149
 950 REM - NUMBER KEYS
 960 FOR n=48 TO 57
 970 READ x: LET k(n)=x: NEXT n
 980 REM - LETTER KEYS
 990 FOR n=65 TO 90
1000 READ x: LET k(n)=x: NEXT n
1010 DATA 23137,23041,23044,23047,22945,22948,22951,22849,22852,22855
1020 DATA 0,22954,23146,0,0,0,0,0,0,23053,23050,0,23140,0,0,0,0,0,0,0,0,22957,0,
0,0,0
1030 REM SET OTHER VALUES
1040 PAPER 1: INK 7
1050 POKE 23658,8
1060 DIM s(17): LET s(1)=0
1070 LET kp=0: LET s$="": LET d=0: LET e=0: LET z=1
1080 LET b$="            0"
1090 REM 
1100 REM ****** MAIN BODY ******
1110 REM 
1120 REM LOOK FOR KEYPRESS
1130 LET i=CODE INKEY$
1140 IF i=13 OR (i>47 AND i<58) OR i=66 OR i=67 OR i=74 OR i=75 OR i=77 OR i=86 
THEN LET kp=1
1150 IF kp=1 THEN GO SUB 1740
1160 IF (i>47 AND i<58) OR i=77 THEN GO SUB 1220
1170 IF i=13 THEN GO SUB 1360
1180 IF i=67 THEN GO SUB 1480
1190 IF i=66 OR i=74 OR i=75 OR i=86 THEN GO SUB 1530
1200 IF kp=1 THEN GO SUB 1820
1210 GO TO 1090
1220 REM NUMBER OR DOT PRESSED
1230 IF s$="" AND i=48 THEN BEEP .1,-24: RETURN 
1240 IF i=77 AND d=1 THEN BEEP .1,-24: RETURN 
1250 IF i=77 AND d=0 THEN LET s$=s$+".": LET d=1
1260 IF i<>77 THEN LET s$=s$+CHR$ i
1270 IF s$="." THEN LET s$="0."
1280 LET l=LEN s$
1290 IF l>13 THEN BEEP .1,-24: LET s$=s$(1 TO 13): LET l=13
1300 POKE 23607,249
1310 PRINT AT 20,31-l;s$
1320 IF s$="" THEN PRINT AT 20,30;"0": LET s(1)=0: POKE 23607,60: RETURN 
1330 IF s$(l)="." THEN LET s(1)=VAL s$( TO l-1): POKE 23607,60: RETURN 
1340 LET s(1)=VAL s$
1350 POKE 23607,60: RETURN 
1360 REM ENTER NUMBER ONTO STACK
1370 IF z=17 THEN BEEP .1,-24: RETURN 
1380 LET z=z+1
1390 FOR n=z TO 2 STEP -1: LET s(n)=s(n-1): NEXT n
1400 LET s(1)=0: LET s$="": LET d=0: LET e=0
1410 FOR n=2 TO z
1420 LET lz=LEN (STR$ s(n))
1430 POKE 23607,249
1440 PRINT AT 20-n,18;b$( TO 13-lz);AT 20-n,31-lz;s(n)
1450 NEXT n
1460 PRINT AT 20,18;b$
1470 POKE 23607,60: RETURN 
1480 REM CLEAR ENTRY
1490 LET s$="": LET s(1)=0: LET d=0: LET e=0
1500 POKE 23607,249
1510 PRINT AT 20,18;b$
1520 POKE 23607,60: RETURN 
1530 REM ARITHMETIC OPERATIONS
1540 IF z=1 THEN BEEP .1,-24: RETURN 
1550 IF i=86 AND s(1)=0 THEN BEEP .1,-24: RETURN 
1560 IF i=75 THEN LET o=s(2)+s(1)
1570 IF i=74 THEN LET o=s(2)-s(1)
1580 IF i=66 THEN LET o=s(2)*s(1)
1590 IF i=86 THEN LET o=s(2)/s(1)
1600 LET s(1)=o: LET s$=STR$ o
1610 IF o<>INT o THEN LET d=1
1620 IF o>=1e8 THEN LET d=1: LET e=1
1630 IF o=INT o AND e<>1 THEN LET d=0
1640 POKE 23607,249
1650 LET lz=LEN (STR$ s(1)): PRINT AT 20,18;b$( TO 13-lz);AT 20,31-lz;s(1)
1660 FOR n=2 TO z-1: LET s(n)=s(n+1): NEXT n
1670 LET s(z)=0: LET z=z-1
1680 FOR n=2 TO z
1690 LET lz=LEN (STR$ s(n))
1700 PRINT AT 20-n,18;b$( TO 13-lz);AT 20-n,31-lz;s(n)
1710 NEXT n
1720 PRINT AT 19-z,18;"             "
1730 POKE 23607,60: RETURN 
1740 REM HIGHLIGHT KEY PRESSED
1750 LET p(1)=PEEK k(i): LET p(5)=p(1)+64
1760 LET p(2)=PEEK (k(i)+1): LET p(6)=p(2)+64
1770 LET p(3)=PEEK (k(i)+32): LET p(7)=p(3)+64
1780 LET p(4)=PEEK (k(i)+33): LET p(8)=p(4)+64
1790 POKE k(i),p(5): POKE k(i)+1,p(6): POKE k(i)+32,p(7): POKE k(i)+33,p(8)
1800 BEEP .05,8
1810 RETURN 
1820 REM DEHIGHLIGHT KEY PRESSED
1830 POKE k(i),p(1): POKE k(i)+1,p(2): POKE k(i)+32,p(3): POKE k(i)+33,p(4)
1840 LET kp=0
1850 RETURN 
